package com.fjl;

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.IndexRequest;
import org.apache.tika.Tika;
import org.apache.tika.exception.TikaException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.List;
import java.util.UUID;

@Service
public class FileIndexService {

    @Autowired
    private FileParserService fileParserService;

    @Autowired
    private ElasticsearchClient elasticsearchClient;

    public void indexFile(String filePath) throws IOException, TikaException {
        String content = fileParserService.parseFile(filePath);

        FileDocument doc = new FileDocument();
        doc.setId(UUID.randomUUID().toString());
        doc.setFileName(filePath.substring(filePath.lastIndexOf("/") + 1));
        doc.setFilePath(filePath);
        doc.setContent(content);

        elasticsearchClient.index(IndexRequest.of(i -> i
                .index("file_index")
                .id(doc.getId())
                .document(doc)
        ));
    }

    public void indexFile(MultipartFile file, List<String> newTags) throws IOException, TikaException {
        // 初始化 Tika
        Tika tika = new Tika();

        // 创建文件文档对象
        FileDocument doc = new FileDocument();
        doc.setId(UUID.randomUUID().toString()); // 设置唯一ID
        doc.setFileName(file.getOriginalFilename()); // 设置文件名
        doc.setTags(newTags);
        // 设置文件路径，可以自定义存储路径，这里假设存储文件到某个路径
        String filePath = "storage/" + file.getOriginalFilename();
        Files.copy(file.getInputStream(), Paths.get(filePath),StandardCopyOption.REPLACE_EXISTING); // 保存文件到指定路径
        doc.setFilePath(filePath); // 设置文件路径

        // 使用 Tika 提取文件内容
        String content = tika.parseToString(file.getInputStream());
        doc.setContent(content); // 设置文件内容

        // 将文件文档对象索引到 Elasticsearch
        elasticsearchClient.index(IndexRequest.of(i -> i
                .index("file_index") // Elasticsearch 索引名
                .id(doc.getId()) // 文件ID
                .document(doc)  // 文件文档对象
        ));
    }
}
